package store;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

/**
 * <p>邻接矩阵</p>
 * <p>这种存图方式也很简单，相信大家在课程学习时就已经能够理解这种存图的思路了</p>
 * <p>这里我们仅展示有向图的存图（无向图就是多了个反方向再存一次）</p>
 * <p>这种存图方式适用于稠密图而对于稀疏图有很大的空间浪费</p>
 *
 * @author 没天赋
 * @since 2025-03-10
 */
public class AdjacencyMatrix {
    public static void main(String[] args) {
        // 最大顶点数
        final int N = 105;
        // 顶点数,边数,查询次数
        int n, m, k;
        Scanner sc = new Scanner(System.in);
        // 邻接矩阵
        int[][] edge = new int[N][N];
        // 顶点与下标对应的哈希表
        HashMap<Character, Integer> map = new HashMap<>(N);

        // 读取顶点数,边数,查询次数
        n = sc.nextInt();
        m = sc.nextInt();
        k = sc.nextInt();
        // 读取顶点与下标对应的哈希表
        for (int i = 1; i <= n; i++) {
            char c = sc.next().charAt(0);
            map.put(c, i);
        }
        // 初始化邻接矩阵
        for (int i = 1; i <= n; i++) {
            Arrays.fill(edge[i], Integer.MAX_VALUE);
        }
        // 将除了自身之外的所有点的距离初始化为无穷大
        for (int i = 1; i <= n; i++) {
            edge[i][i] = 0;
        }
        for (int i = 0; i < m; i++) {
            // 读取边
            char x = sc.next().charAt(0);
            char y = sc.next().charAt(0);
            // 读取边的权值
            edge[map.get(x)][map.get(y)] = sc.nextInt();
        }
        for (int i = 0; i < k; i++) {
            // 读取边
            char x = sc.next().charAt(0);
            char y = sc.next().charAt(0);
            // 输出边权
            System.out.println(edge[map.get(x)][map.get(y)] == Integer.MAX_VALUE ? "无边相连" : edge[map.get(x)][map.get(y)]);
        }
    }
}
/**
 * 测试数据：
 * 5 6 3
 * a b c d e
 * a b 1
 * b c 2
 * a c 3
 * c d 4
 * c e 5
 * a e 6
 * a b
 * c d
 * a d
 * -------
 * 1
 * 4
 * 无边相连
 */